#!/bin/bash
#11/15 10:58:55:619: Launching com.nzy.installapp
#11/15 10:58:55:620: $ hdc shell aa force-stop com.nzy.installapp
#11/15 10:58:55:791: $ hdc shell mkdir data/local/tmp/c3af89b189d2480395ce746621ce6385
#11/15 10:58:55:852: $ hdc file send /Users/xxx/DevEcoStudioProjects/InstallApp/feature/login/build/default/outputs/default/login-default-unsigned.hsp "data/local/tmp/c3af89b189d2480395ce746621ce6385" in 61 ms
#11/15 10:58:55:882: $ hdc file send /Users/xxx.nie/DevEcoStudioProjects/InstallApp/entry/build/default/outputs/default/entry-default-unsigned.hap "data/local/tmp/c3af89b189d2480395ce746621ce6385" in 30 ms
#11/15 10:58:56:103: $ hdc shell bm install -p data/local/tmp/c3af89b189d2480395ce746621ce6385  in 220 ms
#11/15 10:58:56:153: $ hdc shell rm -rf data/local/tmp/c3af89b189d2480395ce746621ce6385
#11/15 10:58:56:410: $ hdc shell aa start -a EntryAbility -b com.nzy.installapp in 182 ms
#11/15 10:58:56:411: Launch com.nzy.installapp success in 791 ms
function printInfo() {
    # ANSI 转义码颜色 绿色
    local message=$1
    printf "\e[32m%s\e[0m\n" "$message" # Info
}
function printDebug() {
    # ANSI 转义码颜色 绿色
    local message=$1
    printf "\e[36m%s\e[0m\n" "$message" # Info
}

function printError() {
    # ANSI 转义码颜色 红色
    local message=$1
    printf "\e[31m%s\e[0m\n" "错误：$message"
    # 退出程序
    exit 1
}

# 下载之后解压的文件夹 ,解压默认是和 install.sh 脚本在同一个目录
hdcZip="tools.zip"
hdcTool="tools"
# hdc文件路径"
hdcPath="tools/hdc"
#包名
bundleName="com.nzy.installapp"
# 要打开的Ability
entryAbility="EntryAbility"

checkAndDownloadHdc(){
  if [ ! -f "${hdcPath}" ]; then
      # 不存在开始下载
      printInfo "首次需要下载hdc工具，2M"
       URL="https://gitee.com/zhiyangnie/install-shell/raw/master/tools.zip"
      # 下载到当前目录的 tools.zip
      # 使用 curl 下载
      curl -o  "$hdcZip" "$URL"
     if [ $? -eq 0 ]; then
          printInfo "下载成功，准备解压${hdcZip}..."
          # 解压ZIP文件
          unzip -o "$hdcZip" -d "${hdcTool}"
          # 检查解压是否成功
          if [ $? -eq 0 ]; then
              printInfo "${hdcZip}解压成功"
              # 删除zip
              rm "$hdcZip"
          else
              printError "${hdcZip} 解压失败，请手动解压"
          fi
      else
          printError "下载失败，请检查网络"
        fi
  fi
}

signHapAndHsp(){
  appCertFile="sign/install.cer"
  profileFile="sign/install.p7b"
  keystoreFile="sign/install.p12"
  keyAlias="zhiyang"
  keyPwd="a123456A"
  keystorePwd="a123456A"
  javaFile="lib/java"
  hapSignToolFile="lib/hap-sign-tool.jar"
  local item=$1
  #遍历文件夹，拿到所有的hsp和hap去签名
  for item in "${tmp}"/*; do
      if [ -f "$item" ]; then
        # 发送 以 .hsp 或 .hap 结尾。
        if [[ "$item" == *.hsp || "$item" == *.hap ]]; then
          # 开始签名
            local inputFile="${item}"
            outputFile=""
            if [[ "$inputFile" == *.hap ]]; then
              outputFile="${inputFile%.hap}-sign.hap"
            else
              outputFile="${inputFile%.hsp}-sign.hsp"
            fi
            signStatus=$(java -jar tools/lib/hap-sign-tool.jar sign-app -keyAlias "${keyAlias}" -signAlg "SHA256withECDSA" -mode "localSign" -appCertFile "${appCertFile}" -profileFile "${profileFile}" -inFile "${inputFile}" -keystoreFile "${keystoreFile}" -outFile "${outputFile}" -keyPwd "${keyPwd}" -keystorePwd "${keystorePwd}" -signCode "1" 2>&1)
            signStatus=$(${javaFile} -jar "${hapSignToolFile}" sign-app -keyAlias "${keyAlias}" -signAlg "SHA256withECDSA" -mode "localSign" -appCertFile "${appCertFile}" -profileFile "${profileFile}" -inFile "${inputFile}" -keystoreFile "${keystoreFile}" -outFile "${outputFile}" -keyPwd "${keyPwd}" -keystorePwd "${keystorePwd}" -signCode "1" 2>&1)
            if [[ "$signStatus" == *"failed"* || $signStatus == *"No such file or directory"* ]]; then
              printError "签名失败，${signStatus}"
            else
              printDebug "签名成功，${inputFile} , ${outputFile}"
#              printDebug "签名成功，${inputFile} , ${outputFile} , ${signStatus}"
              #删除以前未签名的
              rm -f "$inputFile"
            fi
        fi
      fi
  done
  printInfo "签名完成"

}


# 判断是否已经下载过hdc文件
checkAndDownloadHdc

# 判断是否连接手机且仅有一个手机
devicesList=$(${hdcPath} list targets)

# 判断是否hdc 可用
if [ -z "$devicesList" ]; then
  # 开始下载zip
  print_error "hdc 不可用 ，请检查本目录是否存在 ${hdcPath}"
fi

# 判断是否连接手机,如果有 [Empty] 表明 一个手机也没连接
if [[ "$devicesList" == *"[Empty]"* ]]; then
    printError "未识别到手机，请连接手机，打开开发者选项和USB调试"
fi


# 判断连接手机的个数
deviceCount=$(${hdcPath} list targets | wc -l)
if [ "$deviceCount" -ne 1 ]; then
    printError "错误：连接的手机个数是 ${deviceCount} 个,请连接一个手机"
fi

printInfo "连接到手机，且仅有一个手机 ${devicesList}"



# 传过来的参数是 ，获取输入的 app 文件
appFile="$1"

# 判读传过来的路径文件是否以.app 结尾
if [[ ! "${appFile}" =~ .app ]]; then
    printError "请传入正确的包路径，文件要 .app 结尾"
fi

# 判断文件是否存在
if [ ! -e "$appFile" ]; then
    printError "不存在改文件 $appFile 。请确认"
fi

#------------------------------开始安装----------------------------------
# 开始安装
printInfo "开始安装应用, ${bundleName}"
# 1.先kill当前app的进程
$hdcPath shell aa force-stop "$bundleName"

# hdc shell mkdir data/local/tmp/c3af89b189d2480395ce746621ce6385
# 2.创建随机文件夹
randomHex=$(xxd -l 16 -p /dev/urandom)
randomFile="data/local/tmp/$randomHex"
mkDirSuccess=$($hdcPath shell mkdir "$randomFile" 2>&1)
if [ -n "$mkDirSuccess" ]; then
  printError "手机中:随机创建文件夹 ${randomFile} 失败 , $mkDirSuccess"
else
  printInfo "手机中:创建随机文件夹 ${randomFile} 成功"
fi
# 3.解压.app中
# 在本地创建 tmp 临时文件夹
tmp="tmp"
# 存在先删除
if [ -d "${tmp}" ]; then
  rm -rf "$tmp"
fi
mkdir -p "$tmp"
# 解压.app ,使用 unUse 主要是 不想打印那么多的解压日志
unUse=$(unzip -o "$appFile" -d "$tmp")
if [ $? -eq 0 ]; then
    printInfo "解压app成功"
else
    printError "解压app失败，请传入正确的app。$appFile , "
fi

# 对所有的hap和hsp签名，此步骤一般是打包服务器比如jenkins去做的
signHapAndHsp "${tmp}"


printInfo "遍历解压发送到 手机的$randomFile"
# 4.遍历 tmp 文件夹中的文件发送到 randomFile 中
for item in "${tmp}"/*; do
    if [ -f "$item" ]; then
      # 发送 以 .hsp 或 .hap 结尾。
      if [[ "$item" == *.hsp || "$item" == *.hap ]]; then
          $hdcPath file send "$item" "$randomFile"
      fi
    fi
done
printInfo "成功发送到 手机的$randomFile "


# 5. 使用 install
# hdc shell bm install -p data/local/tmp/c3af89b189d2480395ce746621ce6385

installStatus=$($hdcPath shell bm install -p "$randomFile" 2>&1)
if [[ "$installStatus" == *"successfully"* ]]; then
  printInfo "┌────────────────────────────────────────────────────────"
  printInfo "│ ✅ 安装成功 "
  printInfo "└────────────────────────────────────────────────────────"
  ${hdcPath} shell aa start -a "${entryAbility}" -b "$bundleName"
else
   printf "\e[31m%s\e[0m\n" "┌────────────────────────────────────────────────────────"
   printf "\e[31m%s\e[0m\n" "│❌ 安装错误"
   echo "$installStatus" | while IFS= read -r line; do
   printf "\e[31m%s\e[0m\n" "│${line}"
   done
   printf "\e[31m%s\e[0m\n" "│错误码：https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/bm-tool-V5"
   printf "\e[31m%s\e[0m\n" "└────────────────────────────────────────────────────────"

fi

# 6.  删除 手机端的 $randomFile
${hdcPath} shell rm -rf "$randomFile"
# 删除本地的tmp文件夹
rm -rf "$tmp"


# 如果执行 抱着错误 zsh: permission denied: ./a.sh
# 执行，如果没有x 比如像这样 -rw-r--r--
# ls -l install.sh
# 加入x
# chmod +x install.sh



























